'use strict';

var ChangeElementTemplateHandler = require('./ChangeElementTemplateHandler');

var getTemplate = require('../Helper').getTemplate,
    getDefaultTemplate = require('../Helper').getDefaultTemplate;

function registerHandlers(commandStack, elementTemplates, eventBus, elementRegistry) {
    commandStack.registerHandler(
        'propertiesPanel.flowable.changeTemplate',
        ChangeElementTemplateHandler
    );

    // apply default element templates on shape creation
    eventBus.on(['commandStack.shape.create.postExecuted'], function (context) {
        applyDefaultTemplate(context.context.shape, elementTemplates, commandStack);
    });

    // apply default element templates on connection creation
    eventBus.on(['commandStack.connection.create.postExecuted'], function (context) {
        applyDefaultTemplate(context.context.connection, elementTemplates, commandStack);
    });
}

registerHandlers.$inject = ['commandStack', 'elementTemplates', 'eventBus', 'elementRegistry'];


module.exports = {
    __init__: [registerHandlers]
};


function applyDefaultTemplate(element, elementTemplates, commandStack) {

    if (!getTemplate(element, elementTemplates)
        && getDefaultTemplate(element, elementTemplates)) {

        var command = 'propertiesPanel.flowable.changeTemplate';
        var commandContext = {
            element: element,
            newTemplate: getDefaultTemplate(element, elementTemplates)
        };

        commandStack.execute(command, commandContext);
    }
}
